/*
 * Copyright (C), 2005-2018, 上海瑛麒动漫科技有限公司
 * FileName: BeanUtils.java
 * Author:   tianmu
 * Date:     2018年2月22日 上午9:59:07
 * Description: //模块目的、功能描述
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.sfang.common.util.bean;

import org.dozer.DozerBeanMapperBuilder;
import org.dozer.Mapper;

import java.lang.reflect.Field;
import java.util.*;

/**
 * Bean复制相关工具<br>
 * 〈功能详细描述〉
 *
 * @author tianmu
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class BeanUtils {

    private static final Mapper mapper = DozerBeanMapperBuilder.create().build();

    public static boolean hasField(Class<?> clazz, String fieldName) {
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field field : declaredFields) {
            if (field.getName().equals(fieldName)) {
                return true;
            }
        }
        return false;
    }

    public static void setField(Class<?> clazz, String fieldName, Object obj, Object value) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj, value);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 功能描述: <br>
     * 对象拷贝
     *
     * @param source
     * @param destinationClass
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static <T> T beanToBean(Object source, Class<T> destinationClass) {
        return source == null ? null : mapper.map(source, destinationClass);
    }

    /**
     * 功能描述: <br>
     * 对象复制
     *
     * @param sources
     * @param destinations
     * @param clazz
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static <T, E> List<E> beansToBeans(List<T> sources, List<E> destinations, Class<E> clazz) {
        if (sources == null || sources.isEmpty()) {
            return new ArrayList<>();
        }

        if (destinations == null) {
            destinations = new ArrayList<>(sources.size());
        }

        for (T t : sources) {
            destinations.add(mapper.map(t, clazz));
        }

        return destinations;
    }

    /**
     * 功能描述: <br>
     * 对象复制
     *
     * @param sources
     * @param destinations
     * @param clazz
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static <T, E> Set<E> beansToBeans(Set<T> sources, Set<E> destinations, Class<E> clazz) {
        if (sources == null || sources.isEmpty()) {
            return new HashSet<>();
        }

        if (destinations == null) {
            destinations = new HashSet<>(sources.size());
        }

        for (T t : sources) {
            destinations.add(mapper.map(t, clazz));
        }

        return destinations;
    }

    /**
     * 功能描述: <br>
     * 对象转换成Map
     *
     * @param source
     * @param destination
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static <T> Map<String, T> beanToMap(Object source, Map<String, T> destination) {
        if (source == null) {
            return null;
        }

        if (destination == null) {
            destination = new HashMap<>();
        }

        mapper.map(source, destination);
        return destination;
    }

    /**
     * 功能描述: <br>
     * Map转换成对象
     *
     * @param source
     * @param destinationClass
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static <T, E> E mapToBean(Map<String, T> source, Class<E> destinationClass) {
        if (source == null || source.isEmpty()) {
            return null;
        }

        return mapper.map(source, destinationClass);
    }

}
